Tengo el siguiente script de prueba de python (extraído de un archivo .py mucho más grande) que estoy tratando de hacer funcionar en una instancia EC2 (instancia haproxy OpsWorks).
Parece haber una gran diferencia entre los permisos que se aplican cuando se ejecuta como una entrada cron y cuando se ejecuta como un script de python desde el shell.
Lo más cercano que he encontrado en otras publicaciones está aquí, pero está relacionado con los scripts de shell y, dado que estoy ejecutando python OK, las rutas deberían (espero) estar suficientemente configuradas para el cronjob.
Entorno: - Versión de Python: 2.6.8 - Entorno: instancia OpsWorks HAProxy, en EC2. - Ejecutándose como usuario: root.
Texto
import subprocess import boto import logging if __name__ == '__main__': logging.getLogger().setLevel(boto.logging.INFO) command = ['service', 'haproxy', 'reload']; logging.info('Executing: %s' % command) #shell=FALSE for sudo to work. subprocess.call(command, shell=False)Alternativamente, intenté llamar al comando de subproceso usando lo siguiente sin éxito.
# subprocess.call("%s %s %s %s" % ('sudo', 'service', 'haproxy', 'reload'))Salida cuando se ejecuta desde la línea de comando:
[root@lb1 ~]# python tester.py INFO:root:Executing: ['service', 'haproxy', 'reload'] Reloading haproxy: [root@lb1 ~]#Entrada crontab:
[root@lb1 ~]# crontab -l */1 * * * * python ~/tester.py > ~/testlog 2>&1Salida cuando se ejecuta como un comando crontab
[root@lb1 ~]# cat testlog INFO:root:Executing: ['service', 'haproxy', 'reload'] Traceback (most recent call last): File "/root/tester.py", line 13, in <module> subprocess.call(command, shell=False) File "/usr/lib64/python2.6/subprocess.py", line 478, in call p = Popen(*popenargs, **kwargs) File "/usr/lib64/python2.6/subprocess.py", line 639, in __init__ errread, errwrite) File "/usr/lib64/python2.6/subprocess.py", line 1228, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory¡Estoy confundido en cuanto a por qué diablos arroja el error "No existe tal archivo o directorio"!
¿Alguien puede proporcionar algún consejo? Por cierto, esto es parte de una pieza de integración EC2 mucho más grande, por lo tanto, la importación de boto [es una buena manera de iniciar sesión en este caso]. Se ejecuta como root porque, al navegar por SO, es una mala práctica tener una entrada cron para una cuenta de usuario que se ejecuta con un comando sudo.
Salud,
En el conjunto de subprocesos shell=True
subprocess.call(command, shell=True)Creo que su problema se resolverá, pero es posible que surja un problema de Sudo.
Resulta que de hecho está relacionado con la ruta.
Información de ruta para cronjobs
Comandos en submódulos
Para resolverlo, proporcioné las siguientes entradas a través de crontab -e
[root@lb1 ~]# crontab -l SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binAhora mi servicio se reinicia como se esperaba. ¡Hurra!